#pragma once

// 需要获取一些依赖，可以定义在头文件
//
// SerialLog：一个用来输出串口日志的HardwareSerial 对象，兼容Serial 的API
//
#if __has_include("misc_fundamental_app_config.hpp")
    #include "misc_fundamental_app_config.hpp"
#elif __has_include("app.hpp")
    #include "app.hpp"
#else
    // 用来输出调试日志的串口对象
    #include <Arduino.h>
    #define SerialLog Serial
#endif


#ifndef NO_LOG_LINE

template <typename T>
inline void log_no_line(T value) {
    SerialLog.print(value);
}

template <typename T>
inline void log_no_line(T value, const char* suffix) {
    SerialLog.print(value);
    SerialLog.print(suffix);
}


template <typename T>
inline void log_line(T value) {
    SerialLog.println(value);
}


template <typename T>
inline void log_line(const char* str, T value) {
    SerialLog.print(str);
    SerialLog.println(value);
}


/**
 * @brief 输出数据表格
 *
 * 调用 log_line("DATA = ", {1, 2, 3, 4})，
 * 输出 DATA = 1, 2, 3, 4,
 *
 * @tparam T
 * @tparam N
 * @param str
 */
template <typename T, size_t N>
inline void log_line(const char* str, const T (&arr)[N]) {
    SerialLog.print(str);
    for (const auto& v : arr) {
        SerialLog.print(v);
        SerialLog.print(", ");
    }
    SerialLog.println();
}


inline void begin_log(uint32_t baud = 230400) {
    SerialLog.begin(baud);
    SerialLog.println("<< BEGIN LOG >>");
}

#else

template <typename T>
inline void log_no_line(T value) {}

template <typename T>
inline void log_line(T value) {}

template <typename T>
inline void log_line(const char* str, T value) {}

template <typename T, size_t N>
inline void log_line(const char* str, const T (&arr)[N]) {}

inline void begin_log(uint32_t baud = 230400) {}

#endif